package com.android.dawinex;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

import com.incross.dawin.DawinAdActivity;
import com.incross.dawin.DawinConfig;
import com.incross.dawin.views.DawinAdPlayer;
import com.incross.dawin.views.DawinAdPlayer.OnPlayFinishListener;
/**
 * *************************** README *******************************
 * 최종 수정날짜 : 2014-12-18
 * 
 * Dawin 적용 Sample Project
 * 
 *  그동안 다윈을 진행하면서 받은 많은 문의를 토대로 작성을 했습니다. 반드시 참고 하시기 바랍니다. 
 * 
 * 1. 적용할 매채별 정책적으로 다윈 적용방식 결정 
 *   현재 다윈은 Activity 방식의 호출과 다윈이 담겨있는 View 삽입의 두 가지 형식이 있습니다. 대부분의 매체는 View 적용방식을 이용중입니다.
 *   1.1 Activity 호출의 경우 하단의  mShowAdActivityButton의 onClick()대로 호출을 해 주시면 됩니다.
 *   1.2 View 삽입 방식의 경우는 하단의 mShowAdButton의 onClick()방식을 사용하면 정확한 결과를 얻을 수 없습니다. Sample project의 AdActivity 액티비티의 onCreate를 참조하시기 바랍니다.
 * 2. 다윈 서버 설정
 *   다윈 적용 테스트시에는 mcd에 반드시 140번을 넣어야 합니다. 마켓 업데이트시 사업팀과 협의된 mcd 코드를 넣어서 배포하시면 됩니다.
 *   2.1 Activity 호출방식 사용의 경우 하단과 같이 intent의 extra에 true를 넣어주시면 됩니다.  
 *   2.2 View 삽입 방식의 경우는 AdActivity의 onCreate에서 처럼 DawinAdPlayer의 setDawinServerType(DawinConfig.DAWIN_SERVER_REAL) 메소드를 반드시 호출해 주어야 합니다.
 *  
 * 3. 실행
 *   3.1 Activity 호출방식 사용의 경우 하단의 onClick()의 내용처럼 정보만 호출하시면 광고가 재생이 되고, 종료 후 ActivityRsult로 종료 메세지가 전달 됩니다.
 *   3.2 View 삽입 방식의 경우 AdActivity의 DawinAdPlayer.setOnPlayFinishListener(new OnPlayFinishListener() 부분을 참고하시면 됩니다.
 *   
 * 4. 공통적인 확인사항
 *   많은 질문이 왔던 내용 정리합니다.
 *   
 *   - AD_FINISH_ACTION_BUTTON_CLICK 과 AD_FINISH_AFTER_ACTION의 차이는
 *   전자는 액션 버튼으로 광고가 종료되었다는 의미입니다. 광고 종료 후 매체에서 뭔가 준비할 것들이 있는 경우 이 시점에서 준비작업을 하면 됩니다.
 *   후자의 경우 액션으로 광고를 종료하고 해당 액션버튼에 관한 액션(대부분의 경우 액션클릭은 앱을 이탈합니다.)을 마친 후 앱으로 복귀했을 때 호출이 됩니다. 본 영상은 이때 재생해 주시면 됩니다.
 *   액션 버튼이 전화 옵션인 경우 생기는 dialog에서 Back key 또는 취소버튼을 누르는 경우를 제외한 모든 경우에 앱을 이탈합니다.
 *   
 *   - 버튼 클릭당시 특별한 처리 절차가 있는것이 아닌 경우
 *   AD_FINISH_BY_SNS_SHARE, AD_FINISH_BY_TICKER는  AD_FINISH_ACTION_BUTTON_CLICK과 동일하게 처리 하시면 됩니다.
 *   AD_FINISH_AFTER_SNS_SHARE, AD_FINISH_AFTER_TICKER는 AD_FINISH_AFTER_ACTION과 동일하게 처리 하시면 됩니다.
 *   
 *   - 복수광고 호출시 주의사항
 *   AD_FINISH_ACTION_BUTTON_CLICK, AD_FINISH_BY_SNS_SHARE, AD_FINISH_BY_TICKER, AD_FINISH_BACK_KEY_PRESSED 네개의 메세지에서는
 *   앱을 이탈 또는 현재 화면을 벗어나는 경우로 DawinAdPlayer의 showAd를 호출하시면 이상동작 발생할 수 있습니다.
 *   
 * 
 * 
 * @author 김보람
 *********************************************************************
 */
public class DawinExample extends Activity {

	public static final int AD_ACTIVITY = 10000;
	
	private Button mShowAdButton, mShowAdActivityButton;
	private Context mContext;
	
	private DawinAdActivity mAdActivity;
	
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_dawin_example);
		mContext = this;
		initViews();
	}
	
	public void initViews() {
		mShowAdButton = (Button) findViewById(R.id.btn_start_ad);
		mShowAdButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// Component(View) 추가 후 광고 호출 방식
				// Component 추가 방식에 대해서는 하나의 예시로 만들어 둔 것으로 상황에 따라 바꿀 수 있다. 자세한 코드 참조는 AdActivity에서 한다.
				// 광고를 Activity 내분의 한 부분에서 보여주어야 하는 경우 사용. ex) 세로화면에서 상단 광고 화면, 하단 리스트
				// 20140212 추가 참고사항! 하단의 코드는 사용 예를 들어 만들어 둔 코드로 Activity 호출방식이 아닌 DawinAdPlayer를 직접 사용하는 경우는 아래의 형식으로 사용하는 것이 아닌, AdActivity.java 참고해야 합니다.
				Intent intent = new Intent(mContext, AdActivity.class);
				intent.putExtra("gcd", "01040100");
				intent.putExtra("mcd", "140"); // 테스트 매체번호 : 140
				intent.putExtra("pcd", "1");
				intent.putExtra("scd", "02020202");
				intent.putExtra("ccd", "1");
				startActivityForResult(intent, AD_ACTIVITY);
			}
		});
		
		
		mShowAdActivityButton = (Button) findViewById(R.id.btn_start_adActivity);
		mShowAdActivityButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// Activity 호출 방식
				// Activity호출방식에 대한 코드 참조부분
				// 광고를 전체 화면으로 보여주어도 되는 경우에 사용한다. 광고가 나오는 동안에는 Activity의 권한을 Dawin에 위임한다.
				
				Intent intent = new Intent(mContext, DawinAdActivity.class);
				intent.putExtra("gcd", "01040100");
				intent.putExtra("mcd", "140"); // 테스트 매체코드 : 140
				intent.putExtra("pcd", "1");
				intent.putExtra("scd", "02020202");
				intent.putExtra("ccd", "0051");
				intent.putExtra("realServer", true); // true : 반드시 포함하여 사용
				intent.putExtra("backKeyEnabled", true); // true : backKey 사용가능, false : backKey 사용 불가능
				startActivityForResult(intent, AD_ACTIVITY);
			}
		});
	}
	
	@Override
	public void onResume() {
		super.onResume();
	}
	
	@Override
	public void onRestart() {
		super.onRestart();
	}
	
	@Override
	public void onPause() {
		super.onPause();
	}
	
	
	@Override
	public void onStop() {
		super.onStop();
	}
	
	@Override
	public void onDestroy() {
		super.onDestroy();
	}
	
	
	/**
	 * 아래의 코드는 Activity 호출 방식을 사용하는 경우에만 참고합니다. DawinAdPlayer를 직접 사용하는 경우
	 * AdActivity.java를 참고하시기 바랍니다.
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		// Activity를 호출한 경우 받는 메세지.
		
		if(resultCode == RESULT_OK && requestCode == AD_ACTIVITY) {
			if(data != null) {
				int rCode = data.getIntExtra(DawinAdActivity.KEY_RESULT_CODE, -1);
				if(rCode != -1) {
					switch(rCode) {
						case DawinAdPlayer.AD_FINISH_ACTION_COMPLETE:
							// 광고를 다 봤을 때 호출됩니다. 
							// 본 콘텐츠 재생 가능시점!
							Toast.makeText(mContext, "재생완료 종료", Toast.LENGTH_SHORT).show();
							break;
							
						case DawinAdPlayer.AD_FINISH_ACTION_SKIP:
							// 광고 재생 중 스킵을 클릭한 경우 호출된다.
							// 본 콘텐츠 재생 가능시점!!
							Toast.makeText(mContext, "스킵 종료", Toast.LENGTH_SHORT).show();
							break;
							
						case DawinAdPlayer.AD_FINISH_SCREEN_CLICK:
							// 화면 클릭 이벤트가 있는 경우에 한해 화면을 클릭한 경우 호출된다.(AD_FINISH_ACTION_BUTTON_CLICK과 동일하게 동작하지만 액션 구분을 위해 분리함.)
							// 앱 이탈 이전에 처리할 내용이 있는 경우에 사용. 특별한 처리내용이 없으면 무시 가능함. 
							// 본 콘텐츠 재생불가(본 메세지 이후에 앱 이탈)
							Toast.makeText(mContext, "스크린 클릭 종료", Toast.LENGTH_SHORT).show();
							break;
							
						case DawinAdPlayer.AD_FINISH_ACTION_BUTTON_CLICK:
							// 액션 버튼 이벤트가 있는 경우에 한해 액션 노출된 액션 버튼을 클릭한 경우 호출.
							// 앱 이탈 이전에 처리할 내용이 있는 경우에 사용. 특별한 처리내용이 없으면 무시 가능함. 
							// 본 콘텐츠 재생불가(본 메세지 이후에 앱 이탈)
							Toast.makeText(mContext, "액션버튼 클릭", Toast.LENGTH_SHORT).show();
							break;
							
						case DawinAdPlayer.AD_FINISH_CALL_ACTION:
							// 다윈 영상 재생중 전화 수신 등 전화와 관련된 동을 할 때 호출된다. (액션에 의한 전화 발신의 경우는 AD_FINISH_ACTION_BUTTON_CLICK 호출, 티커 전화상품으로 인한 전화 발신의 경우는 AD_FINISH_BY_TICKER 호출)
							// 앱 이탈 이전에 처리할 내용이 있는 경우에 사용. 특별한 처리내용이 없으면 무시 가능함. 
							// 본 콘텐츠 재생불가(본 메세지 이후에 앱 이탈)
							Toast.makeText(mContext, "전화액션 종료", Toast.LENGTH_SHORT).show();
							break;
							
						case DawinAdPlayer.AD_FINISH_NO_APPLICABLE_AD:
							// 요청에 대한 광고가 없는 경우에 호출된다.
							// 본 콘텐츠 재생 가능시점!!
							Toast.makeText(mContext, "해당 광고 없음 종료", Toast.LENGTH_SHORT).show();
							break;
							
						case DawinAdPlayer.AD_FINISH_BACK_KEY_PRESSED:
							// Back key를 누른 경우 호출이 되는데, Activity의 onBackPressed가 호출되는 시점에 DawinAdPlayer.onBackPressed()를 호출해야 동작한다.
							// 본 콘텐츠 재생불가(본 메세지 이후에 이전 페이지로 이동 등의 앱 설정을 따름)
							Toast.makeText(mContext, "Back key 종료", Toast.LENGTH_SHORT).show();
							break;
							
						case DawinAdPlayer.AD_FINISH_AFTER_ACTION:
							// 화면 이벤트 또는 액션 버튼에 의해 클릭뷰어가 뜬 경우, 해당 클릭동작에서 화면클릭종료(또는 액션버튼 종료) 메세지를 보내주지만,
							// Activity의 onPause시 DawinAdPlayer.onPause(), onResume시 DawinAdPlayer.onResume()을 호출해 주어야 정상 동작함.
							// 본 콘텐츠 재생 가능시점!!
							Toast.makeText(mContext, "액션버튼 동작 후 종료", Toast.LENGTH_SHORT).show();
							break;
							
						case DawinAdPlayer.AD_FINISH_BY_SNS_SHARE:
							// sns share 버튼을 클릭하여 공유 가능한 SNS List에서 최 우측의 링크 복사 및 X 버튼을 제외한 나머지 버튼을 클릭한 경우 호출됨. 이후 공유를 위해 단말 내장 브리우저로 해당 주소로 이동.(앱 이탈)
							// 앱 이탈 이전에 처리할 내용이 있는 경우에 사용. 특별한 처리내용이 없으면 무시 가능함. 
							// 본 콘텐츠 재생불가(본 메세지 이후에 앱 이탈)
							Toast.makeText(mContext, "Sns share button 종료", Toast.LENGTH_SHORT).show();
							break;
							
						case DawinAdPlayer.AD_FINISH_AFTER_SNS_SHARE:
							// sns share로 인해 앱 이탈 후 복귀
							// 본 콘텐츠 재생 가능시점!!
							Toast.makeText(mContext, "Sns 동작 후 종료", Toast.LENGTH_SHORT).show();
							break;

						case DawinAdPlayer.AD_FINISH_BY_TICKER:
							// 티커 상품을 클릭하여 티커 상품에 할당된 액션을 실행하기 직전에 호출됨. 티커 전화 발신 상품을 제외하고 티커 해당 페이지 오픈을 위해 단말 내장 브리우저로 해당 주소로 이동.(전화상품 제외하고  앱 이탈)
							// 앱 이탈 이전에 처리할 내용이 있는 경우에 사용. 특별한 처리내용이 없으면 무시 가능함. 
							// 본 콘텐츠 재생불가(본 메세지 이후에 앱 이탈)
							Toast.makeText(mContext, "티커 종료", Toast.LENGTH_SHORT).show();
							break;

						case DawinAdPlayer.AD_FINISH_AFTER_TICKER:
							// ticker 클릭로 인해 앱 이탈 후 복귀
							// 본 콘텐츠 재생 가능시점!!
							Toast.makeText(mContext, "티커 동작 후 종료", Toast.LENGTH_SHORT).show();
							break;
							
						case DawinAdPlayer.AD_FINISH_OTHER_REASON:
							// 위에 나열된 이유 이외에 정상적인 경로로 광고 정보 등을 받았으나, 기타 다른 이유로 Activity를 벗어나는 액션을 취한 경우(또는 슬립모드 진입)등 이상 현상 발생 호출된다.
							// Activity의 onPause시 DawinAdPlayer.onPause(), onResume시 DawinAdPlayer.onResume()을 호출해 주어야 사용 가능
							// 앱 이탈 이전에 처리할 내용이 있는 경우에 사용. 특별한 처리내용이 없으면 무시 가능함. 
							// 본 콘텐츠 재생불가(본 메세지 이후에 대부분 현재 페이지 사라지는 이슈 발생함)
							Toast.makeText(mContext, "기타 이유로 종료", Toast.LENGTH_SHORT).show();
							break;
							
						case DawinAdPlayer.AD_FINISH_NETWORK_DISCONNECTED:
							// 광고요청시 네트워크가 끊어진 경우 호출된다.
							// 본 콘텐츠 재생 가능시점!! (다윈 광고를 요청한 시점에 끊어졌을 수도 있으므로 본 콘텐츠 재생요청 가능)
							Toast.makeText(mContext, "Network disconnect.. 종료", Toast.LENGTH_SHORT).show();
							break;
							
						case DawinAdPlayer.AD_FINISH_AD_INFO_RECEIVE_FAIL:
							// 광고정보 수신 실패시 호출. 타임아웃, 파싱 실패 등 다양한 이유로 광고 정보를 제대로 받지 못한 경우 호출.
							// 본 콘텐츠 재생 가능시점!!
							Toast.makeText(mContext, "광고정보 수신 실패 종료", Toast.LENGTH_SHORT).show();
							break;
							
						case DawinAdPlayer.AD_FINISH_OTHER_ERROR:
							// DawinAdPlayer가 알 수 없는 미디어 플레이어 오류 발생, 또는 동작 중 에러 발생등의 비정상적인 상황에서 호출된다.
							// 본 콘텐츠 재생 가능시점!!
							Toast.makeText(mContext, "기타 오류로 종료", Toast.LENGTH_SHORT).show();
							break;
					}
					
				}
				
			}
			
		}
	}
	
}
